W przypadku kolumn, w którym przechowywane są dane tekstowe, kluczowym krokiem jest zamiana tych wartości na wartości numeryczne przed użyciem w modelu uczenia maszynowego. W zależności od charakteru danych można zastosować różne metody:
from sklearn.preprocessing import LabelEncoder
le = LabelEncoder()
df['column_name'] = le.fit_transform(df['column_name'])
#dla zbioru testowego/walidacyjnego należy enkodera utworzonego na zbiorze treningowym (w tym przypadku df):
test_df['column_name'] = le.transform(test_df['column_name'])
df = pd.get_dummies(df, columns=['column_name'])
mapping = {'val_1': 1, 'val_2': 2, 'val_3': 3}
df['column_name'] = df['column_name'].map(mapping)
Przykład jak wygląda zakodowanie kolumny ocena
, w której przechowywane są wartości: niska
, średnia
i wysoka
:
Index | Ocena |
---|---|
0 | wysoka |
1 | niska |
2 | średnia |
3 | średnia |
4 | wysoka |
wysoka
-> 0, niska
-> 1, średnia
-> 2)Index | Ocena |
---|---|
0 | 0 |
1 | 1 |
2 | 2 |
3 | 2 |
4 | 0 |
Index | niska | średnia | wysoka |
---|---|---|---|
0 | 0 | 0 | 1 |
1 | 1 | 0 | 0 |
2 | 0 | 1 | 0 |
3 | 0 | 1 | 0 |
4 | 0 | 0 | 1 |
{'niska': 0, 'średnia': 1, 'wysoka': 2}
:Index | Ocena |
---|---|
0 | 2 |
1 | 0 |
2 | 1 |
3 | 1 |
4 | 2 |
Data binning jest techniką wstępnej obróbki danych, która polega na grupowaniu ciągłych danych liczbowych w dyskretne przedziały lub "koszyki". W efekcie, zamiast mieć nieskończony zestaw możliwych wartości liczbowych, przekształcamy dane na określoną liczbę przedziałów, co ułatwia analizę i może poprawić działanie niektórych modeli uczenia maszynowego.
Zaletami jest uproszczenie interpretacji (na danych ciągłych może być trudność w analizie datasetu), obsługę nieliniowości, zmniejszenie wpływu szumu (po podziale na koszyki drobne fluktuacje mają mniejsze znaczenie, co pozwala zrozumieć ogólne trendy), oraz ułatwienie modelowania, bo część modeli (np. drzewa decyzyjne) mogą działać lepiej, kiedy dane zamiast być ciągłe to są podzielone na przedziały.
Wyróżnić można następujące rodzaje binningu:
wiek
mogłaby zostać podzielona na 3 podzbiory 0-18
, 18-65
i 65+
).Przykład implementacji każdej z przedstawionych metod znajduje się poniżej:
import pandas as pd
# Przykładowy DataFrame z kolumną 'Wiek'
data_wiek = {'Wiek': [5, 17, 25, 45, 67, 72, 15, 60, 19, 84]}
df_wiek = pd.DataFrame(data_wiek)
# Przedziały o równej szerokości
df_wiek['Wiek_equal_width'] = pd.cut(df_wiek['Wiek'], bins=3, labels=[0, 1, 2])
# Przedziały o równej liczebności
df_wiek['Wiek_equal_freq'] = pd.qcut(df_wiek['Wiek'], q=3, labels=[0, 1, 2])
# Na podstawie własnych reguł na koszyki 0-18, 18-65 i 65+
bins_business = [0, 18, 65, float('inf')]
labels_business = [0, 1, 2]
df_wiek['Wiek_own_rules'] = pd.cut(df_wiek['Wiek'], bins=bins_business, labels=labels_business)
Czasami w procesie analizy danych nie wystarczy po prostu użyć surowych wartości — warto pomyśleć o tym, jak możemy z istniejących danych wyciągnąć dodatkowe informacje lub wyliczyć bardziej użyteczne cechy, które mogą mieć większe znaczenie dla modelu lub analizy. Tego rodzaju proces, zwany feature engineering, może znacznie poprawić wyniki modelu i jakość wniosków. Oto kilka przykładów, jak można wykorzystać istniejące dane do wyciągania dodatkowych informacji:
Kliknij tutaj, aby wrócić do strony głównej tematu. Możesz stamtąd przejść do wykonania zadań przygotowanych w Jupyter Notebook.